m4_define([libxmp_VERSION_MAJOR_m4], 4)
m4_define([libxmp_VERSION_MINOR_m4], 6)
m4_define([libxmp_VERSION_PATCH_m4], 0)
m4_define([libxmp_VERSION_m4], libxmp_VERSION_MAJOR_m4[.]libxmp_VERSION_MINOR_m4[.]libxmp_VERSION_PATCH_m4)

AC_PREREQ(2.60)
AC_INIT([libxmp],libxmp_VERSION_m4)
AC_ARG_ENABLE(depackers, [  --disable-depackers     Don't build depackers])
AC_ARG_ENABLE(prowizard, [  --disable-prowizard     Don't build ProWizard])
AC_ARG_ENABLE(static,    [  --enable-static         Build static library])
AC_ARG_ENABLE(shared,    [  --disable-shared        Don't build shared library])
AC_SUBST(LD_VERSCRIPT)
AC_SUBST(LIBM)
AC_SUBST(DARWIN_VERSION)
AC_CANONICAL_HOST
AC_PROG_CC
LT_PATH_LD
AC_CHECK_TOOL(AR, [ar], [:])
AC_PROG_RANLIB
AC_PROG_INSTALL

AC_C_BIGENDIAN

dnl XMP_TRY_COMPILE(<message>,<cache-var>,<flags>,<program>,<ifyes>,<ifno>)
AC_DEFUN([XMP_TRY_COMPILE],[
  AC_CACHE_CHECK([$1],[$2],[
    oldcflags="${CFLAGS}"
    CFLAGS="${CFLAGS} $3"
    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[$4]])],[$2=yes],[$2=no],[true])
    CFLAGS="${oldcflags}"])
  AS_IF([test "x$$2" = xyes], [$5], [$6])])

AC_DEFUN([AC_CHECK_DEFINED],[
  AS_VAR_PUSHDEF([ac_var],[ac_cv_defined_$1])dnl
  AC_CACHE_CHECK([for $1 defined], ac_var,
  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[
    #ifdef $1
    int ok;
    #else
    choke me
    #endif
  ]])],[AS_VAR_SET(ac_var, yes)],[AS_VAR_SET(ac_var, no)]))
  AS_IF([test AS_VAR_GET(ac_var) != "no"], [$2], [$3])dnl
  AS_VAR_POPDEF([ac_var])dnl
])

case "${host_cpu}" in
powerpc64)
  CFLAGS="${CFLAGS} -m64"
  LDFLAGS="${LDFLAGS} -m64"
  ;;
esac

case "${host_os}" in
darwin*)
  DARWIN_VERSION="`echo ${host_os#darwin}|cut -f1 -d'.'`"
  if test "${enable_shared}" != no; then
    CFLAGS="${CFLAGS} -fno-common"
  fi
  ;;
cygwin* | *djgpp | mint* | amigaos* |aros* | morphos*)
  enable_static=yes
  enable_shared=no
  ;;
esac

AC_CHECK_DEFINED(__clang__)

case "${host_os}" in
dnl Skip this on platforms where it is just simply busted.
 openbsd*) ;;
 darwin*) LDFLAGS="$LDFLAGS -Wl,-undefined,error" ;;
 dnl For whatever reason, the Clang sanitizers and --no-undefined for
 dnl shared libraries are incompatible.
 *) if test "$ac_cv_defined___clang__" = "no" || test "${LDFLAGS#*fsanitize}" = "$LDFLAGS"
    then
      save_LDFLAGS="$LDFLAGS"
      LDFLAGS="$LDFLAGS -Wl,--no-undefined"
      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [], [LDFLAGS="$save_LDFLAGS"])
    fi
    ;;
esac

if test "${enable_static}" = yes; then
  AC_SUBST(STATIC,static)
fi
if test "${enable_shared}" != no; then
  AC_CHECK_DEFINED(_WIN32,[
    AC_SUBST(SHARED,dll)
    CFLAGS_SHARED="-DBUILDING_DLL"
  ],[
    CFLAGS_SHARED="-fPIC"
    AC_CHECK_DEFINED(__APPLE__,[
      AC_SUBST(SHARED,dylib)
    ],[
      AC_SUBST(SHARED,shared)
    ])
  ])
  AC_SUBST(CFLAGS_SHARED)
fi

XMP_TRY_COMPILE(whether compiler understands -Wall,
  ac_cv_c_flag_w_all,
  -Wall,[
  int main(void){return 0;}],
  CFLAGS="${CFLAGS} -Wall")

XMP_TRY_COMPILE(whether compiler understands -Wextra,
  ac_cv_c_flag_w_extra,
  -Wextra,[
  int main(void){return 0;}],
  CFLAGS="${CFLAGS} -Wextra")

if test x$ac_cv_c_flag_w_extra != xyes; then
  XMP_TRY_COMPILE(whether compiler understands -W,
    ac_cv_c_flag_w, -W,
   [int main(void){return 0;}], CFLAGS="${CFLAGS} -W")
fi

XMP_TRY_COMPILE(whether compiler understands -Wunused-parameter,
  ac_cv_c_flag_w_unused_parameter,
  -Wunused-parameter,[
  int main(void){return 0;}],
  CFLAGS="${CFLAGS} -Wno-unused-parameter")

XMP_TRY_COMPILE(whether compiler understands -Wsign-compare,
  ac_cv_c_flag_w_sign_compare,
  -Wsign-compare,[
  int main(void){return 0;}],
  CFLAGS="${CFLAGS} -Wno-sign-compare")

XMP_TRY_COMPILE(whether compiler understands -Wwrite-strings,
  ac_cv_c_flag_w_write_strings,
  -Wwrite-strings,[
  int main(void){return 0;}],
  CFLAGS="${CFLAGS} -Wwrite-strings")

old_CFLAGS="${CFLAGS}"
XMP_TRY_COMPILE(whether compiler understands -Werror,
  ac_cv_c_flag_w_error,
  -Werror,[
  int main(void){return 0;}],
  CFLAGS="${CFLAGS} -Werror")

XMP_TRY_COMPILE(whether compiler understands -xldscope=hidden,
  ac_cv_c_flag_xldscope_hidden,
  -xldscope=hidden,[
  __global int foo(void) {}],
  [CFLAGS="${old_CFLAGS} -xldscope=hidden -DXMP_LDSCOPE_GLOBAL"],
  [XMP_TRY_COMPILE(whether compiler understands -fvisibility=hidden,
    ac_cv_c_flag_f_visibility_hidden,
    -fvisibility=hidden,[
__attribute__((visibility("default"))) int foo(void);
__attribute__((visibility("hidden")))  int bar(void);
int foo(void) { return 0; }
int bar(void) { return 1; }])]
)

case $host_os in
    mingw*|cygwin*|emx*|*djgpp|amigaos*|aros*|morphos*)
	if test $ac_cv_c_flag_f_visibility_hidden = yes; then
	   AC_MSG_NOTICE([ignoring -fvisibility flags for $host_os])
	fi
	ac_cv_c_flag_f_visibility_hidden=no
	;;
esac

have_versioned_symbols=no
if test $ac_cv_c_flag_f_visibility_hidden = no; then
   CFLAGS="${old_CFLAGS}"
else
   CFLAGS="${old_CFLAGS} -fvisibility=hidden -DXMP_SYM_VISIBILITY"

   if test $lt_cv_prog_gnu_ld = yes; then
      case "${host_os}" in
        emscripten*|beos*|atheos*|*mint)
          ;;
        *) if test "${enable_shared}" != no; then
              have_versioned_symbols=yes
              CFLAGS_SHARED="${CFLAGS_SHARED} -DUSE_VERSIONED_SYMBOLS=1"
         fi
         LD_VERSCRIPT="-Wl,--version-script,libxmp.map"
         ;;
      esac
   fi

   old_CFLAGS="${CFLAGS}"
   if test $ac_cv_c_flag_w_error = yes; then
      CFLAGS="${CFLAGS} -Werror"
   fi
   XMP_TRY_COMPILE(whether compiler understands attribute externally_visible,
    ac_cv_c_attribute_visibility_external,[],[
__attribute__((visibility("default"),externally_visible)) int foo(void);
int foo(void) { return 0; }],
    [CFLAGS="${old_CFLAGS} -DHAVE_EXTERNAL_VISIBILITY"],
    [CFLAGS="${old_CFLAGS}"])

   XMP_TRY_COMPILE(whether compiler understands attribute __symver__,
    ac_cv_c_attribute_symver,[-Werror=attributes],[
void foo(void) __attribute__((__symver__("foo@bar")));],
    [CFLAGS="${CFLAGS} -DHAVE_ATTRIBUTE_SYMVER"],
    [CFLAGS="${CFLAGS}"])
fi

AC_MSG_CHECKING(whether to enable versioned symbols support)
AC_MSG_RESULT($have_versioned_symbols)

dnl for clang
XMP_TRY_COMPILE(whether compiler understands -Wunknown-warning-option,
  ac_cv_c_flag_w_unknown_warning_option,
  -Wunknown-warning-option,[
  int main(void){return 0;}],
  CFLAGS="${CFLAGS} -Wno-unknown-warning-option")

if test "${enable_depackers}" != no; then
  DEPACKER_OBJS='$(DEPACKER_OBJS)'
else
  CFLAGS="${CFLAGS} -DLIBXMP_NO_DEPACKERS"
fi
AC_SUBST(DEPACKER_OBJS)

if test "${enable_prowizard}" != no; then
  PROWIZARD_OBJS='$(PROWIZARD_OBJS)'
else
  CFLAGS="${CFLAGS} -DLIBXMP_NO_PROWIZARD"
fi
AC_SUBST(PROWIZARD_OBJS)

LIBM=
case "${host_os}" in
dnl These systems don't have libm or don't need it (list based on libtool)
mingw*|darwin*|cygwin*|haiku*|beos*|cegcc*|pw32*)
  ;;
dnl djgpp has all c89 math funcs in libc.a
*djgpp)
  ;;
*) AC_CHECK_LIB(m, ceil, LIBM="-lm")
  LIBS="${LIBS} ${LIBM}"
  ;;
esac
AC_CHECK_FUNCS(powf)

AC_MSG_CHECKING(for dirent)
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <dirent.h>]], [[
  DIR *dirp = opendir(".");
  struct dirent *d = readdir(dirp);
  (void)d; closedir(dirp);]])],
 [have_dirent=yes
  AC_DEFINE(HAVE_DIRENT,1,[ ])],
 [have_dirent=no])
AC_MSG_RESULT($have_dirent)

AC_CHECK_FUNCS(popen mkstemp fnmatch umask)
dnl fork, execv & co don't work with djgpp
case "${host_os}" in
*djgpp|mingw*|riscos*)
  ;;
*) AC_CHECK_FUNCS(wait pipe fork execvp dup2)
  ;;
esac

case "${host_os}" in
amigaos*|aros*|morphos*)
  AC_CHECK_HEADERS(proto/xfdmaster.h)
  ;;
esac

AC_SUBST([libxmp_VERSION_MAJOR],libxmp_VERSION_MAJOR_m4)
AC_SUBST([libxmp_VERSION_MINOR],libxmp_VERSION_MINOR_m4)
AC_SUBST([libxmp_VERSION_PATCH],libxmp_VERSION_PATCH_m4)
AC_SUBST([libxmp_VERSION],libxmp_VERSION_m4)

AC_CONFIG_FILES([Makefile])
AC_CONFIG_FILES([libxmp.pc])
AC_CONFIG_FILES([libxmp-config-version.cmake.autotools])
AC_OUTPUT
